package com.hzw.saas.common.pay.alipay.config;

import javax.annotation.PostConstruct;

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * 支付宝支付全局统一配置
 *
 * @author zzl
 * @since 2020-09-23
 */
// @Component()
// @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
// @ConditionalOnProperty(name = "alipay.notifyUrl", matchIfMissing = false)
// @ConfigurationProperties(prefix = "alipay", ignoreInvalidFields = true, ignoreUnknownFields = true)
@Data
@Slf4j
public class AliPayConfig {

    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private static AliPayConfig instance;

    /**
     * AlipayClient 的实现类都是线程安全的，因此使用单例模式
     */
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private static AlipayClient alipayClient;

    /**
     * 支付宝网关
     */
    private String gateway = "https://openapi.alipaydev.com/gateway.do";

    /**
     * 服务器异步通知页面路径  需http://格式的完整路径，不能加?id=123这类自定义参数，必须外网可以正常访问
     */
    private String notifyUrl;
    /**
     * 页面跳转同步通知页面路径 需http://格式的完整路径，不能加?id=123这类自定义参数，必须外网可以正常访问
     */
    private String returnUrl;

    /**
     * 应用ID
     * 收款账号即为APPID对应支付宝账号
     */
    private String appId;
    /**
     * 商户的私钥
     * PKCS8格式RSA2私钥
     */
    private String appPrivateKey;
    /**
     * 支付宝的公钥
     * (非应用公钥)
     * 查看地址：https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥
     */
    private String aliPublicKey;

    /**
     * 签名方式
     */
    private String signType = "RSA2";

    /**
     * 字符编码格式
     */
    private String charset = "utf-8";

    /**
     * 格式
     */
    private String format = "json";

    /**
     * 日期格式
     */
    private String dataFormat = "yyyy-MM-dd HH:mm:ss";

    /**
     * 二维码宽度
     * qr_pay_mode=4时该参数生效
     */
    private String qrcodeWidth = "200";


    @PostConstruct
    private void init() {
        this.verifyParams();
        AliPayConfig.alipayClient = new DefaultAlipayClient(gateway, appId, appPrivateKey, format, charset, aliPublicKey, signType);
        AliPayConfig.instance = this;
    }

    private void verifyParams() {
        String message = "获取支付宝配置参数<{}>: {}";
        String errorMsg = "获取支付宝配置参数<{}>异常";
        log.debug("加载支付宝配置参数...");
        // gateway
        if (StrUtil.isBlank(this.gateway)) {
            log.error(errorMsg, "gateway");
        } else {
            log.debug(message, "gateway", this.gateway);
        }
        // notifyURL
        if (StrUtil.isBlank(this.notifyUrl)) {
            log.error(errorMsg, "notifyURL");
        } else {
            log.debug(message, "notifyURL", this.notifyUrl);
        }
        // returnURL
        if (StrUtil.isBlank(this.returnUrl)) {
            log.error(errorMsg, "returnURL");
        } else {
            log.debug(message, "returnURL", this.returnUrl);
        }
        // appId
        if (StrUtil.isBlank(this.appId)) {
            log.error(errorMsg, "appId");
        } else {
            log.debug(message, "appId", this.appId);
        }
        // privateKey
        if (StrUtil.isBlank(this.appPrivateKey)) {
            log.error(errorMsg, "privateKey");
        } else {
            log.debug(message, "privateKey", this.appPrivateKey);
        }
        // aliPublicKey
        if (StrUtil.isBlank(this.aliPublicKey)) {
            log.error(errorMsg, "aliPublicKey");
        } else {
            log.debug(message, "aliPublicKey", this.aliPublicKey);
        }
        // signType
        if (StrUtil.isBlank(this.signType)) {
            log.error(errorMsg, "signType");
        } else {
            log.debug(message, "signType", this.signType);
        }
        // charset
        if (StrUtil.isBlank(this.charset)) {
            log.error(errorMsg, "charset");
        } else {
            log.debug(message, "charset", this.charset);
        }
        // format
        if (StrUtil.isBlank(this.format)) {
            log.error(errorMsg, "format");
        } else {
            log.debug(message, "format", this.format);
        }
        // qrcodeWidth
        if (StrUtil.isBlank(this.qrcodeWidth)) {
            log.error(errorMsg, "qrcodeWidth");
        } else {
            log.debug(message, "qrcodeWidth", this.qrcodeWidth);
        }
        log.debug("加载支付宝配置参数完成.");
    }

    public static AliPayConfig config() {
        return instance;
    }

    public static AlipayClient client() {
        return alipayClient;
    }
}


